#pragma once

#include <cstdint>

namespace ly {

// =============================================================================
// 1. 操作指令类 Tag（瞬态，处理后应自动清除）
// 用于命令模式、Undo/Redo、事件驱动
// =============================================================================

// 标记为“待添加”的实体（通常用于 Undo 或复制粘贴）
struct ToAddTag {};

// 标记为“待删除”的实体（系统将在下一帧处理并清除）
struct ToRemoveTag {};

// 标记为“待更新”的实体（如几何变化、属性修改）
struct ToUpdateTag {};

// 标记为“待刷新显示”的实体（脏标记）
struct DirtyTag {
  enum Cause : uint8_t { Geometry = 1, Style = 2, Property = 4, All = 0xFF } flags = All;

  DirtyTag() = default;
  explicit DirtyTag(Cause c) : flags(c) {}
  void set(Cause c) { flags = static_cast<Cause>(flags | c); }
  bool test(Cause c) const { return (flags & c) != 0; }
};

// =============================================================================

// =============================================================================
// 2. 状态类 Tag（持久，用户操作维持）
// 表示实体的当前状态
// =============================================================================

// 实体被锁定（不可编辑）
struct LockedTag {};

// 实体被选中（用于高亮、移动、删除）
struct SelectedTag {};

// 实体被隐藏（不渲染）
struct HiddenTag {};

// 实体被悬停（鼠标 hover）
struct HoveredTag {};

// 实体被禁用（灰显，不可交互）
struct DisabledTag {};

// 实体是临时辅助线/标注
struct TemporaryTag {};

// 实体是参考对象（如对齐辅助）
struct ReferenceTag {};

// =============================================================================

// =============================================================================
// 3. 分组与层级 Tag（可选，用于高级编辑）
// =============================================================================

// 属于某个用户组（如“电源网络”）
struct GroupTag {
  uint32_t group_id;
  explicit GroupTag(uint32_t id) : group_id(id) {}
};

// 层次化路径（用于实例路径追踪）
struct InstancePathTag {
  // 可存储从顶层到当前实例的 CellId 路径
  std::vector<uint32_t> path;
  explicit InstancePathTag(std::vector<uint32_t> p) : path(std::move(p)) {}
};

// =============================================================================

// =============================================================================
// 4. 工具专用 Tag（可选）
// =============================================================================

// 正在被拖拽
struct DraggingTag {};

// 正在被拉伸（如边框调整）
struct ResizingTag {};

// 正在进行 DRC 检查
struct DrcCheckTag {};

// =============================================================================

}  // namespace ly
